package com.demo.java.OD51_100.OD81;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【求最多可以派出多少支团队】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145621979
 */
public class OdMain {
    public static int solve(int num, String[] lines, int limit) {
        int maxTeam = 0;
        int[] abilities = new int[num];

        // 将输入的能力值字符串转化为整数数组
        for (int i = 0; i < num; i++) {
            abilities[i] = Integer.parseInt(lines[i]);
        }

        // 对能力值数组进行排序
        Arrays.sort(abilities);

        // 使用双指针技术：一个指向最小值，一个指向最大值
        int start = 0, end = num - 1;

        // 处理能力值大于限制的舞者，直接算作单独的舞队
        while (start <= end) {
            if (abilities[start] + abilities[end] <= limit) {
                // 如果可以配对，就让这两个人组成一个舞队
                maxTeam++;
                start++;
                end--;
            } else {
                // 否则，最大的舞者单独组成舞队
                maxTeam++;
                end--;
            }
        }

        return maxTeam;
    }

    public static void main(String[] args) {
        try {
            Scanner s = new Scanner(System.in);
            int num = Integer.parseInt(s.nextLine()); // 获取舞者数量
            String[] lines = s.nextLine().split(" "); // 获取舞者的能力值
            int limit = Integer.parseInt(s.nextLine()); // 获取能力限制值

            // 调用解题函数并输出结果
            System.out.println(solve(num, lines, limit));
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("输入错误");
        }
    }
}